/**
 * 超级管理员初始化工具
 * 负责系统启动时创建默认超级管理员账户
 */

import bcrypt from 'bcryptjs';
import { config } from '../config';

/**
 * 超级管理员配置接口
 */
export interface SuperAdminConfig {
  username: string;
  email: string;
  password: string;
  realName: string;
}

/**
 * 获取超级管理员默认配置
 */
export const getSuperAdminConfig = (): SuperAdminConfig => {
  return {
    username: config.superAdmin.username,
    email: config.superAdmin.email,
    password: config.superAdmin.password,
    realName: config.superAdmin.realName,
  };
};

/**
 * 生成安全的密码哈希
 * @param password 明文密码
 * @returns 哈希后的密码
 */
export const hashPassword = async (password: string): Promise<string> => {
  const saltRounds = 12;
  return await bcrypt.hash(password, saltRounds);
};

/**
 * 验证密码
 * @param password 明文密码
 * @param hashedPassword 哈希密码
 * @returns 是否匹配
 */
export const verifyPassword = async (
  password: string,
  hashedPassword: string
): Promise<boolean> => {
  return await bcrypt.compare(password, hashedPassword);
};

/**
 * 生成安全的Session ID
 * @returns 随机Session ID
 */
export const generateSessionId = (): string => {
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  let result = '';
  for (let i = 0; i < 32; i++) {
    result += chars.charAt(Math.floor(Math.random() * chars.length));
  }
  return result;
};

/**
 * 验证用户名格式
 * @param username 用户名
 * @returns 是否有效
 */
export const validateUsername = (username: string): boolean => {
  if (!username || typeof username !== 'string') {
    return false;
  }
  // 用户名规则：3-20个字符，只能包含字母、数字、下划线
  const usernameRegex = /^[a-zA-Z0-9_]{3,20}$/;
  return usernameRegex.test(username);
};

/**
 * 验证邮箱格式
 * @param email 邮箱地址
 * @returns 是否有效
 */
export const validateEmail = (email: string): boolean => {
  if (!email || typeof email !== 'string') {
    return false;
  }
  // 更严格的邮箱验证规则
  const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
  return emailRegex.test(email) && !email.includes('..');
};

/**
 * 验证密码强度
 * @param password 密码
 * @returns 验证结果
 */
export const validatePassword = (password: string): {
  isValid: boolean;
  errors: string[];
} => {
  const errors: string[] = [];

  // 最少8个字符
  if (password.length < 8) {
    errors.push('密码长度至少8个字符');
  }

  // 包含大写字母
  if (!/[A-Z]/.test(password)) {
    errors.push('密码必须包含至少一个大写字母');
  }

  // 包含小写字母
  if (!/[a-z]/.test(password)) {
    errors.push('密码必须包含至少一个小写字母');
  }

  // 包含数字
  if (!/\d/.test(password)) {
    errors.push('密码必须包含至少一个数字');
  }

  // 包含特殊字符
  if (!/[!@#$%^&*(),.?":{}|<>]/.test(password)) {
    errors.push('密码必须包含至少一个特殊字符');
  }

  return {
    isValid: errors.length === 0,
    errors,
  };
};

/**
 * 验证超级管理员配置
 * @param config 超级管理员配置
 * @returns 验证结果
 */
export const validateSuperAdminConfig = (config: SuperAdminConfig): {
  isValid: boolean;
  errors: string[];
} => {
  const errors: string[] = [];

  // 验证用户名
  if (!validateUsername(config.username)) {
    errors.push('用户名格式无效：3-20个字符，只能包含字母、数字、下划线');
  }

  // 验证邮箱
  if (!validateEmail(config.email)) {
    errors.push('邮箱格式无效');
  }

  // 验证密码
  const passwordValidation = validatePassword(config.password);
  if (!passwordValidation.isValid) {
    errors.push(...passwordValidation.errors);
  }

  // 验证真实姓名
  if (!config.realName || config.realName.trim().length < 2) {
    errors.push('真实姓名至少需要2个字符');
  }

  return {
    isValid: errors.length === 0,
    errors,
  };
};